; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -odebug_printf.o --depend=debug_printf.d --device=DARMAD -I.\inc -I.\efsl-0.2.8\inc -I.\efsl-0.2.8\conf -IC:\Keil\ARM\INC\ADI -D__MICROLIB -D__KEIL__ debug_printf.c]
                          ARM

                          AREA ||i.UART_Config||, CODE, READONLY, ALIGN=2

                  UART_Config PROC
;;;43     
;;;44     void UART_Config(void){
000000  e3a01000          MOV      r1,#0
;;;45       // Setup tx & rx pins on P1.0 and P1.1
;;;46       GP1CON |= 0x011;
000004  e5110bfc          LDR      r0,[r1,#-0xbfc]
000008  e3800011          ORR      r0,r0,#0x11
00000c  e5010bfc          STR      r0,[r1,#-0xbfc]
;;;47       
;;;48       // Start setting up UART at 9600bps
;;;49       COMCON0 = 0x080;	 // Setting DLAB
000010  e3a02080          MOV      r2,#0x80
000014  e2410801          SUB      r0,r1,#0x10000
000018  e580270c          STR      r2,[r0,#0x70c]
;;;50       //  COMDIV0 = 0x088;	 // Setting DIV0 and DIV1 to DL calculated 9600
;;;51       COMDIV0 = 0x00b;	 // Setting DIV0 and DIV1 to DL calculated 115200
00001c  e3a0200b          MOV      r2,#0xb
000020  e5802700          STR      r2,[r0,#0x700]
;;;52       COMDIV1 = 0x000;
000024  e5801704          STR      r1,[r0,#0x704]
;;;53       COMCON0 = 0x007;	 // Clearing DLAB
000028  e3a01007          MOV      r1,#7
00002c  e580170c          STR      r1,[r0,#0x70c]
;;;54     }
000030  e12fff1e          BX       lr
;;;55     
                          ENDP


                          AREA ||i.debug_printf||, CODE, READONLY, ALIGN=2

                  debug_printf PROC
;;;55     
;;;56     void debug_printf(char const *format, ...)
000000  e92d000f          PUSH     {r0-r3}
;;;57     {
000004  e92d43fe          PUSH     {r1-r9,lr}
;;;58       unsigned char scratch[SCRATCH];
;;;59       unsigned char format_flag;
;;;60       unsigned short base;
;;;61       unsigned char *ptr;
;;;62       unsigned char issigned=0;
;;;63       va_list ap;
;;;64     
;;;65     #ifdef USE_LONG
;;;66       unsigned char islong=0;
;;;67       unsigned long u_val=0;
;;;68       long s_val=0;
;;;69     #else
;;;70       unsigned int u_val=0;
;;;71       int s_val=0;
;;;72     #endif
;;;73     
;;;74       unsigned char fill;
;;;75       unsigned char width;
;;;76     
;;;77       va_start (ap, format);
000008  e28d402c          ADD      r4,sp,#0x2c
;;;78       for (;;){
00000c  ea000002          B        |L2.28|
                  |L2.16|
;;;79         while ((format_flag = *(format++)) != '%'){      // Until '%' or '\0' 
;;;80           if (!format_flag){va_end (ap); return;}
000010  e3500000          CMP      r0,#0
000014  0a00006c          BEQ      |L2.460|
000018  ea00003a          B        |L2.264|
                  |L2.28|
00001c  e59d1028          LDR      r1,[sp,#0x28]         ;79
000020  e4d10001          LDRB     r0,[r1],#1            ;79
000024  e58d1028          STR      r1,[sp,#0x28]         ;79
000028  e3500025          CMP      r0,#0x25              ;79
00002c  1afffff7          BNE      |L2.16|
;;;81           myputchar(format_flag);
;;;82         }
;;;83     
;;;84         issigned=0; //default unsigned
;;;85         base = 10;
;;;86     
;;;87         format_flag = *format++; //get char after '%'
000030  e4d10001          LDRB     r0,[r1],#1
;;;88     
;;;89     #ifdef PADDING
;;;90         width=0; //no formatting
000034  e3a06000          MOV      r6,#0
000038  e3a0800a          MOV      r8,#0xa               ;85
;;;91         fill=0;  //no formatting
;;;92         if(format_flag=='0' || format_flag==' ') //SPACE or ZERO padding  ?
00003c  e3500030          CMP      r0,#0x30
000040  13500020          CMPNE    r0,#0x20
000044  e1a07006          MOV      r7,r6                 ;91
000048  e58d1028          STR      r1,[sp,#0x28]
00004c  1a000007          BNE      |L2.112|
;;;93          {
;;;94           fill=format_flag;
000050  e1a07000          MOV      r7,r0
;;;95           format_flag = *format++; //get char after padding char
000054  e4d10001          LDRB     r0,[r1],#1
;;;96           if(format_flag>='0' && format_flag<='9')
000058  e58d1028          STR      r1,[sp,#0x28]
00005c  e2402030          SUB      r2,r0,#0x30
000060  e3520009          CMP      r2,#9
;;;97            {
;;;98             width=format_flag-'0';
;;;99             format_flag = *format++; //get char after width char
000064  94d10001          LDRBLS   r0,[r1],#1
000068  920260ff          ANDLS    r6,r2,#0xff           ;98
00006c  958d1028          STRLS    r1,[sp,#0x28]
                  |L2.112|
;;;100           }
;;;101         }
;;;102    #endif
;;;103    
;;;104    #ifdef USE_LONG
;;;105        islong=0; //default int value
;;;106    #ifdef USE_UPPER
;;;107        if(format_flag=='l' || format_flag=='L') //Long value 
000070  e350006c          CMP      r0,#0x6c
000074  1350004c          CMPNE    r0,#0x4c
;;;108    #else
;;;109        if(format_flag=='l') //Long value 
;;;110    #endif
;;;111         {
;;;112          islong=1;
;;;113          format_flag = *format++; //get char after 'l' or 'L'
000078  059d2028          LDREQ    r2,[sp,#0x28]
00007c  e3a01000          MOV      r1,#0                 ;105
000080  04d20001          LDRBEQ   r0,[r2],#1
000084  03a01001          MOVEQ    r1,#1                 ;112
000088  058d2028          STREQ    r2,[sp,#0x28]
;;;114         }
;;;115    #endif
;;;116    
;;;117        switch (format_flag)
00008c  e3500063          CMP      r0,#0x63
000090  0a00001a          BEQ      |L2.256|
000094  ca00000d          BGT      |L2.208|
000098  e3500053          CMP      r0,#0x53
00009c  0a00001b          BEQ      |L2.272|
0000a0  ca000005          BGT      |L2.188|
0000a4  e3500043          CMP      r0,#0x43
0000a8  0a000014          BEQ      |L2.256|
0000ac  e3500044          CMP      r0,#0x44
0000b0  13500049          CMPNE    r0,#0x49
0000b4  0a000023          BEQ      |L2.328|
0000b8  ea000012          B        |L2.264|
                  |L2.188|
0000bc  e3500055          CMP      r0,#0x55
0000c0  0a00001b          BEQ      |L2.308|
0000c4  e3500058          CMP      r0,#0x58
0000c8  0a000018          BEQ      |L2.304|
0000cc  ea00000d          B        |L2.264|
                  |L2.208|
0000d0  e3500073          CMP      r0,#0x73
0000d4  0a00000d          BEQ      |L2.272|
0000d8  ca000003          BGT      |L2.236|
0000dc  e3500064          CMP      r0,#0x64
0000e0  13500069          CMPNE    r0,#0x69
0000e4  0a000017          BEQ      |L2.328|
0000e8  ea000006          B        |L2.264|
                  |L2.236|
0000ec  e3500075          CMP      r0,#0x75
0000f0  0a00000f          BEQ      |L2.308|
0000f4  e3500078          CMP      r0,#0x78
0000f8  0a00000c          BEQ      |L2.304|
0000fc  ea000001          B        |L2.264|
                  |L2.256|
;;;118        {
;;;119    #ifdef USE_CHAR
;;;120        case 'c':
;;;121    #ifdef USE_UPPER
;;;122        case 'C':
;;;123    #endif
;;;124          format_flag = va_arg(ap,int);
000100  e4940004          LDR      r0,[r4],#4
000104  e20000ff          AND      r0,r0,#0xff
                  |L2.264|
;;;125          // no break -> run into default
;;;126    #endif
;;;127    
;;;128        default:
;;;129          myputchar(format_flag);
000108  ebfffffe          BL       myputchar
;;;130          continue;
00010c  eaffffc2          B        |L2.28|
                  |L2.272|
;;;131    
;;;132    #ifdef USE_STRING
;;;133    #ifdef USE_UPPER
;;;134        case 'S':
;;;135    #endif
;;;136        case 's':
;;;137          ptr = (unsigned char*)va_arg(ap,char *);
000110  e4943004          LDR      r3,[r4],#4
;;;138          while(*ptr) { myputchar(*ptr); ptr++; }
000114  ea000001          B        |L2.288|
                  |L2.280|
000118  ebfffffe          BL       myputchar
00011c  e2833001          ADD      r3,r3,#1
                  |L2.288|
000120  e5d30000          LDRB     r0,[r3,#0]
000124  e3500000          CMP      r0,#0
000128  1afffffa          BNE      |L2.280|
00012c  eaffffba          B        |L2.28|
                  |L2.304|
;;;139          continue;
;;;140    #endif
;;;141    
;;;142    #ifdef USE_OCTAL
;;;143        case 'o':
;;;144    #ifdef USE_UPPER
;;;145        case 'O':
;;;146    #endif
;;;147          base = 8;
;;;148          myputchar('0');
;;;149          goto CONVERSION_LOOP;
;;;150    #endif
;;;151    
;;;152    #ifdef USE_INTEGER //don't use %i, is same as %d
;;;153        case 'i':
;;;154    #ifdef USE_UPPER
;;;155        case 'I':
;;;156    #endif
;;;157    #endif
;;;158        case 'd':
;;;159    #ifdef USE_UPPER
;;;160        case 'D':
;;;161    #endif
;;;162          issigned=1;
;;;163          // no break -> run into next case
;;;164        case 'u':
;;;165    #ifdef USE_UPPER
;;;166        case 'U':
;;;167    #endif
;;;168    
;;;169    //don't insert some case below this if USE_HEX is undefined !
;;;170    //or put       goto CONVERSION_LOOP;  before next case.
;;;171    #ifdef USE_HEX
;;;172          goto CONVERSION_LOOP;
;;;173        case 'x':
;;;174    #ifdef USE_UPPER
;;;175        case 'X':
;;;176    #endif
;;;177          base = 16;
000130  e3a08010          MOV      r8,#0x10
                  |L2.308|
;;;178    #endif
;;;179    
;;;180        CONVERSION_LOOP:
;;;181    
;;;182          if(issigned) //Signed types
;;;183           {
;;;184    #ifdef USE_LONG
;;;185            if(islong) { s_val = va_arg(ap,long); }
;;;186            else { s_val = va_arg(ap,int); }
;;;187    #else
;;;188            s_val = va_arg(ap,int);
;;;189    #endif
;;;190    
;;;191            if(s_val < 0) //Value negativ ?
;;;192             {
;;;193              s_val = - s_val; //Make it positiv
;;;194              myputchar('-');    //Output sign
;;;195             }
;;;196    
;;;197            u_val = (unsigned long)s_val;
;;;198           }
;;;199          else //Unsigned types
;;;200           {
;;;201    #ifdef USE_LONG
;;;202            if(islong) { u_val = va_arg(ap,unsigned long); }
000134  e4940004          LDR      r0,[r4],#4
                  |L2.312|
;;;203            else { u_val = va_arg(ap,unsigned int); }
;;;204    #else
;;;205            u_val = va_arg(ap,unsigned int);
;;;206    #endif
;;;207           }
;;;208        
;;;209          ptr = scratch + SCRATCH;
;;;210          *--ptr = 0;
000138  e3a02000          MOV      r2,#0
00013c  e28d500b          ADD      r5,sp,#0xb
000140  e5cd200b          STRB     r2,[sp,#0xb]
;;;211          do
000144  ea000006          B        |L2.356|
                  |L2.328|
000148  e4943004          LDR      r3,[r4],#4            ;186
00014c  e3530000          CMP      r3,#0                 ;191
000150  b2633000          RSBLT    r3,r3,#0              ;193
000154  b3a0002d          MOVLT    r0,#0x2d              ;194
000158  bbfffffe          BLLT     myputchar
00015c  e1a00003          MOV      r0,r3                 ;197
000160  eafffff4          B        |L2.312|
                  |L2.356|
;;;212           {
;;;213            char ch = u_val % base + '0';
000164  e1a01008          MOV      r1,r8
000168  ebfffffe          BL       __aeabi_uidivmod
00016c  e2811030          ADD      r1,r1,#0x30
000170  e20110ff          AND      r1,r1,#0xff
;;;214    #ifdef USE_HEX
;;;215            if (ch > '9')
000174  e3510039          CMP      r1,#0x39
;;;216             {
;;;217              ch += 'a' - '9' - 1;
;;;218    #ifdef USE_UPPERHEX
;;;219              ch-=0x20;
000178  82811007          ADDHI    r1,r1,#7
00017c  820110ff          ANDHI    r1,r1,#0xff
;;;220    #endif
;;;221             }
;;;222    #endif          
;;;223            *--ptr = ch;
;;;224            u_val /= base;
;;;225    
;;;226    #ifdef PADDING
;;;227            if(width) width--; //calculate number of padding chars
000180  e3560000          CMP      r6,#0
000184  e5651001          STRB     r1,[r5,#-1]!          ;223
000188  12461001          SUBNE    r1,r6,#1
00018c  120160ff          ANDNE    r6,r1,#0xff
;;;228    #endif
;;;229          } while (u_val);
000190  e3500000          CMP      r0,#0
000194  1afffff2          BNE      |L2.356|
000198  ea000000          B        |L2.416|
                  |L2.412|
;;;230    
;;;231    #ifdef PADDING
;;;232         while(width--) *--ptr = fill; //insert padding chars		      
00019c  e5657001          STRB     r7,[r5,#-1]!
                  |L2.416|
0001a0  e1b00006          MOVS     r0,r6
0001a4  e2461001          SUB      r1,r6,#1
0001a8  e20160ff          AND      r6,r1,#0xff
0001ac  1afffffa          BNE      |L2.412|
0001b0  ea000001          B        |L2.444|
                  |L2.436|
;;;233    #endif
;;;234    
;;;235          while(*ptr) { myputchar(*ptr); ptr++; }
0001b4  ebfffffe          BL       myputchar
0001b8  e2855001          ADD      r5,r5,#1
                  |L2.444|
0001bc  e5d50000          LDRB     r0,[r5,#0]
0001c0  e3500000          CMP      r0,#0
0001c4  1afffffa          BNE      |L2.436|
0001c8  eaffff93          B        |L2.28|
                  |L2.460|
;;;236        }
;;;237      }
;;;238    }
0001cc  e8bd03fe          POP      {r1-r9}
0001d0  e49df014          LDR      pc,[sp],#0x14
                          ENDP


                          AREA ||i.myputchar||, CODE, READONLY, ALIGN=2

                  myputchar PROC
;;;31     
;;;32     int myputchar(int ch)  {                   /* Write character to Serial Port  */
000000  e59f102c          LDR      r1,|L3.52|
;;;33       if (ch == '\n')  {
000004  e350000a          CMP      r0,#0xa
000008  1a000004          BNE      |L3.32|
                  |L3.12|
;;;34         while(!(0x020==(COMSTA0 & 0x020)))
00000c  e5912714          LDR      r2,[r1,#0x714]
000010  e3120020          TST      r2,#0x20
000014  0afffffc          BEQ      |L3.12|
;;;35           {}
;;;36         COMTX = CR;							/* output CR */
000018  e3a0200d          MOV      r2,#0xd
00001c  e5812700          STR      r2,[r1,#0x700]
                  |L3.32|
;;;37       }
;;;38       while(!(0x020==(COMSTA0 & 0x020)))
000020  e5912714          LDR      r2,[r1,#0x714]
000024  e3120020          TST      r2,#0x20
000028  0afffffc          BEQ      |L3.32|
;;;39         {}
;;;40       
;;;41       return (COMTX = ch);
00002c  e5810700          STR      r0,[r1,#0x700]
;;;42     }
000030  e12fff1e          BX       lr
;;;43     
                          ENDP

                  |L3.52|
                          DCD      0xffff0000
